import Vue from 'vue'
import 'es6-promise/auto'
import Vuex from 'vuex'
import defaultState from "./defaultState";
import mutations from "./mutations";
import getters from "./getters";
import moduleA from "./module/moduleA";
import moduleB from "./module/moduleB";

import createLogger from 'vuex/dist/logger'

Vue.use(Vuex)

export default function () {
  const store = new Vuex.Store({
    // 严格模式（发布环境下，不开启严格模式；  开发环境下开启即可）
    strict: process.env.NODE_ENV !== 'production',

    state: defaultState,
    mutations: mutations,
    getters: getters,
    modules: {
      moduleA,
      moduleB
    },
    plugins: [myPlugin, createLogger()]
  })

  // 热重载
  // if(module.hot){
  //   // 使所有操作成为可热重载模块
  //   module.hot.accept(["./defaultState","./getters","./mutations", "./module/moduleA", "./module/moduleB"],() =>{
  //     const newState = require('./defaultState').default
  //     const newGetters = require('./getters').default
  //     const newMutations = require('./mutations').default
  //     const newModuleA = require('./module/moduleA').default
  //     const newModuleB = require('./module/moduleB').default
  //
  //     // 加载新模块
  //     store.hotUpdate({
  //       state:newState,
  //       getters:newGetters,
  //       mutations:newMutations,
  //       actions:newActions,
  //       modules: {
  //         moduleA: newModuleA,
  //         moduleB: newModuleB
  //       }
  //     })
  //   })
  // }

  return store
}

//插件
const myPlugin = store => {
  // 当 store 初始化后调用
  store.subscribe((mutation, state) => {
    console.log('自定义插件打印：',mutation,state);
  })
}

// vuex 内置日志插件
const logger = createLogger({
  collapsed: false, // 自动展开记录的 mutation
  filter (mutation, stateBefore, stateAfter) {
    // 若 mutation 需要被记录，就让它返回 true 即可
    // 顺便，`mutation` 是个 { type, payload } 对象
    return mutation.type !== "aBlacklistedMutation"
  },
  transformer (state) {
    // 在开始记录之前转换状态
    // 例如，只返回指定的子树
    return state.subTree
  },
  mutationTransformer (mutation) {
    // mutation 按照 { type, payload } 格式记录
    // 我们可以按任意方式格式化
    return mutation.type
  },
  logger: console, // 自定义 console 实现，默认为 `console`
})
